package ch10
{
	import flash.display.Sprite;
	import flash.events.Event;

	import utils.Ball;

	/**
	 * 角度反弹
	 * @author sjp
	 *
	 */
	public class AngleBounce extends Sprite
	{
		private var ball:Ball;
		private var line:Sprite;
		private var gravity:Number=0.3;
		private var bounce:Number=-0.6;

		public function AngleBounce()
		{
			init();
		}

		private function init():void
		{
			ball=new Ball();
			addChild(ball);
			ball.x=100;
			ball.y=100;
			line=new Sprite();
			line.graphics.lineStyle(1);
			line.graphics.lineTo(300, 0);
			addChild(line);
			line.x=50;
			line.y=200;
			/**
			 * 负角度，例如：-30，写成150会有错误
			 * */
			//line.rotation=-30;
			line.rotation=30;
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onEnterFrame(event:Event):void
		{
			// 普通的运动代码 
			ball.vy+=gravity;
			ball.x+=ball.vx;
			ball.y+=ball.vy;
			// 获得角度及正余弦值 
			var angle:Number=line.rotation * Math.PI / 180;
			var cos:Number=Math.cos(angle);
			var sin:Number=Math.sin(angle);
			// 获得 ball 与 line 的相对位置 
			var x1:Number=ball.x - line.x;
			var y1:Number=ball.y - line.y;
			// 旋转坐标 
			/**
			 * 这里的加号与减号与最初的坐标旋转公式是相反的，
			 * 最初我们的公式是：
			 * x1 = cos(angle) * x - sin(angle) * y;
			 * y1 = cos(angle) * y + sin(angle) * x;
			 * 这并没有错。考虑一下，假如 line 旋转了 17 度，如果使用最初的公式，求出旋转度数会比 17 度大，是 34 度！
			 * 我们实际想要旋转 -17 度，这样才会使度数变为 0。
			 * 那么就应该这样计算正余弦值 Math.sin(-angle) 和 Math.cos(-angle)。
			 * 但是，最后还需要用到最初的角度来使所有物体都旋转回去。
			 * */
			var x2:Number=cos * x1 + sin * y1;
			var y2:Number=cos * y1 - sin * x1;
			// 旋转速度向量 
			var vx1:Number=cos * ball.vx + sin * ball.vy;
			var vy1:Number=cos * ball.vy - sin * ball.vx;
			// 实现反弹 
			/**
			 * 注意因为 y2 是与 line 影片相对的，“底部”边界就是 line 自己。
			 * 考虑一下小球的位置，判断什么时候 y2 大于 0 – ball.height / 2。
			 * 简短的写法就是这样： 
			 * if(y2 > -ball.height / 2)
			 * */
			if (y2 > -ball.height / 2)
			{
				y2=-ball.height / 2;
				vy1*=bounce;
			}
			// 将一切旋转回去 
			x1=cos * x2 - sin * y2;
			y1=cos * y2 + sin * x2;
			ball.vx=cos * vx1 - sin * vy1;
			ball.vy=cos * vy1 + sin * vx1;
			ball.x=line.x + x1;
			ball.y=line.y + y1;
		}
	}
}